import { login, logout, getInfo } from '@/api/user'//和api.js产生关系.
import{login2,getInfo2,handleRegistration} from '@/api/user/user2'
import { getToken, setToken, removeToken } from '@/utils/auth'//和utils产生关系
import router, { resetRouter } from '@/router'//和router产生关系。

const getDefaultState = () => {
  return {
    token: getToken(),//来源于src/utils/auth,和 cookie有关了。
    name: '',
    avatar: '',
    roles:[],/*原来这里是role：[],这里查一个s*/
    introduction:'',
  }
}

const state = getDefaultState()//state是一个对象

const mutations = {  // action ~ mutation ~ state。 mutation和state最近了，可以直接改变state.
  RESET_STATE: (state) => {//RESET_STATE是一个参数为state的函数。
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {//把state中的token设置为传入的token。
    state.token = token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  SET_ROLES: (state,roles)=>{ /*开始写成SET_ROUTES了*/
    state.roles =roles
  },
  SET_INTRODUCTION:(state,introduction)=>{
    state.introduction=introduction
  }
}

const actions = {
  // user login
  login({ commit }, userInfo) {//？谁来调用actions中的login方法？dispatch吗？感觉少了个参数。
    const { userName, passWord } = userInfo
    // console.log(username,password)
    return new Promise((resolve, reject) => {//？this.$store.dispatch('user/login', this.form).then(resolve).catch(reject)
      //请求后台登录，trim功能：删除字符串中多余的空格，但会在英文字符串中保留一个作为词与词之间分隔的空格。

      /*后端来一个接口，如果密码和账户匹配，我这里能够获取该用户的token。*/
      login2({ userName: userName.trim(), passWord: passWord }).then(response => {//很像axios的请求。response哪来的？=>mock/user.js中来
        const { data } = response//mock.js里面返回过来的response
        // console.log("store/user.js里面的response："+response)
        //设置token,作为用户已登录前端的表示，存在cookie中.commit是vuex的语法。
        commit('SET_TOKEN', data.token)//commit应该是一个方法，第一个参数是一个函数，第二个参数是从后端来的data中的token。~ state有关。
        setToken(data.token)//来源于auth.js文件中的setToken方法 ~ cookie相关。
        resolve(data.token)//改变状态，成功，在login.vue界面里面可以得到该response。
      }).catch(error => {
        //登录失败，回传提示信息
        reject("错误,我是Promise里面的reject"+error)//?在哪里起作用了?
      })

    })
  },

  // get user info 获取用户信息
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      //请求获取权限
      /*后端来一个接口，根据这个token,能获取到用户的roles。这里存在映射啊，一个用户名，对应唯一的一个token。根据tokens，可以从后端获取数据。*/
      getInfo2(state.token).then(response => {
        const { data } = response
        console.log("我是login2中的data:")
        console.log(data)

        if (!data) {
          return reject('Verification failed, please Login again.')
        }

        const { userName, avatar,role,introduction } = data
        commit('SET_ROLES', role)
        commit('SET_NAME', userName)//获取用户名
        commit('SET_AVATAR', avatar)//获取头像
        commit('SET_INTRODUCTION','https://images.weserv.nl/?url='+introduction)
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },

  // user logout
  logout({ commit, state }) {
    return new Promise((resolve, reject) => {
      logout(state.token).then(() => {
        removeToken() // must remove  token  first
        resetRouter()
        commit('RESET_STATE')
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  },
  //动态地modify（调整）权限
  async changeRoles({ commit, dispatch }, role) {
    const token = role + '-token'

    commit('SET_TOKEN', token)
    setToken(token)

    const { roles } = await dispatch('getInfo')

    resetRouter()

    // generate accessible routes map based on roles
    const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
    // dynamically add accessible routes
    router.addRoutes(accessRoutes)

    // reset visited views and cached views
    dispatch('tagsView/delAllViews', null, { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

